//有效 IP 地址 正好由四个整数（每个整数位于 0 到 255 之间组成，且不能含有前导 0），整数之间用 '.' 分隔。
//
//
// 例如："0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址，但是 "0.011.255.245"、"192.168.1.312"
//和 "192.168@1.1" 是 无效 IP 地址。
//
//
// 给定一个只包含数字的字符串 s ，用以表示一个 IP 地址，返回所有可能的有效 IP 地址，这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新
//排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
//
//
//
// 示例 1：
//
//
//输入：s = "25525511135"
//输出：["255.255.11.135","255.255.111.35"]
//
//
// 示例 2：
//
//
//输入：s = "0000"
//输出：["0.0.0.0"]
//
//
// 示例 3：
//
//
//输入：s = "101023"
//输出：["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
//
//
//
//
// 提示：
//
//
// 1 <= s.length <= 20
// s 仅由数字组成
//
//
// Related Topics 字符串 回溯与递归 👍 1227 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function restoreIpAddresses(s: string): string[] {

    function backtracking(s,startIndex, route) {

        //? 出口1：route长度为4 startIndex长度大于等于字符串长度(即到了最后)
        if (route.length === 4 && startIndex >= s.length) {
            res.push(route.join('.'))
            return;
        }
        //? 出口2：route长度到了但s没遍历完 或s遍历完了route不够长
        if (route.length === 4 || startIndex >= s.length) return;

        for (let i = startIndex + 1; i <= s.length; i ++) {
            if (isValidIpSegment(s.slice(startIndex, i))) {
                route.push(s.slice(startIndex, i))
                backtracking(s,i, route)
                route.pop()
            }

        }
    }
    let res : string[] = []
    backtracking(s,0, [])
    return res
};
//? 是否合法判断方法
function isValidIpSegment(str: string): boolean {
    let resBool: boolean = true;
    let tempVal: number = Number(str);
    if (
        str.length === 0 || isNaN(tempVal) ||
        tempVal > 255 || tempVal < 0 ||
        (str.length > 1 && str[0] === '0')
    ) {
        resBool = false;
    }
    return resBool;
}
//leetcode submit region end(Prohibit modification and deletion)
